import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() => runApp(MyApp());

/*
* 依赖Flutter灵活的消息传递机制，Flutter通过平台通道将消息发送到当前平台，原生平台收到消息立即调用当前平台
* 特定API，并将响应发送到Flutter
*    1. Flutter的部分称为客户端Client，发送与方法调用相对应的消息
*    2. 原生端称为宿主Host接收方法并返回结果
*    3. 二者通过平台通道通信(platform channels)，MethodChannel（iOS平台为FlutterMethodChannel）
*     消息和响应以异步的方式在客户端(UI)和宿主(平台)之间传递，确保用户界面保持响应
*    4. 传递消息时，MethodChannel使用标准消息编解码器，高效的支持二进制序列化，序列化/反序列化操作自动进行
* */
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('获取手机电量'),
        ),
        body: Center(
          child: Column(
            children: [
              GetBatteryWidget(),
            ],
          ),
        ),
      ),
    );
  }
}

// 通过原生代码获取当前电量
class GetBatteryWidget extends StatefulWidget {
  @override
  _GetBatteryWidgetState createState() => _GetBatteryWidgetState();
}

class _GetBatteryWidgetState extends State<GetBatteryWidget> {
  String batterLevel = "";

  // 获取平台通信通道(名称需要与原生端一致)
  static const platform = const MethodChannel('method.fauks.com/batteryLevel');

  Future<Null> getBatterLevel() async {
    try {
      int result = await platform.invokeMethod('getBatteryLevel');
      batterLevel = "当前电量 $result";
    } catch (e) {
      batterLevel = "获取电量失败：$e";
    }
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(batterLevel),
        ElevatedButton(
          onPressed: getBatterLevel,
          child: Text('获取电量'),
        )
      ],
    );
  }
}
